package com.indyforge.twod.engine.util.iteration; import java.util.Iterator; import java.util.LinkedList; import java.util.NoSuchElementException; import java.util.Queue; /** * A composite iterator combines multiple iterators. * * @author Christopher Probst * * @param <E> * The element type. */ public final class CompositeIterator<E> implements Iterator<E> { // The queue which stores all iterators private final Queue<Iterator<? extends E>> iterators = new LinkedList<Iterator<? extends E>>(); // The remove pointer private Iterator<? extends E> removePtr = null; /** * Creates a new composite iterator using the iterator array. * * @param iterators * The iterators. */ public CompositeIterator(Iterator<? extends E>... iterators) { this(new ArrayIterator<Iterator<? extends E>>(iterators)); } /** * Creates a new composite iterator using the iterator. * * @param iterators */ public CompositeIterator(Iterator<? extends Iterator<? extends E>> iterators) { if (iterators != null) { // Iterate... while (iterators.hasNext()) { // Get next Iterator<? extends E> iterator = iterators.next(); // Add only valid iterators... if (iterator != null && iterator.hasNext()) { this.iterators.offer(iterator); } } } } /* * (non-Javadoc) * * @see java.util.Iterator#hasNext() */ @Override public boolean hasNext() { return !iterators.isEmpty(); } /* * (non-Javadoc) * * @see java.util.Iterator#next() */ @Override public E next() { if (!hasNext()) { throw new NoSuchElementException(); } // Get iterator Iterator<? extends E> itr = iterators.element(); // Store next object E next = itr.next(); // Store remove reference removePtr = itr; // Empty now ? if (!itr.hasNext()) { iterators.remove(); } // Return the next return next; } /* * (non-Javadoc) * * @see java.util.Iterator#remove() */ @Override public void remove() { if (removePtr != null) { removePtr.remove(); removePtr = null; } } }